[XEN][HVM] Arrange that we only consider sending a PV-on-HVM event channel
authorSteven Smith <ssmith@xensource.com>
Fri, 29 Sep 2006 14:40:19 +0000 (15:40 +0100)
committerSteven Smith <ssmith@xensource.com>
Fri, 29 Sep 2006 14:40:19 +0000 (15:40 +0100)
callback interrupt in vcpu 0.  This avoids a race in SMP HVM domains
which could lead to interrupts never getting delivered.  It is safe
because HVM domains always bind their event channels to vcpu 0.

Bug pointed out by Keir.

Signed-off-by: Steven Smith <sos22@cam.ac.uk>
xen/arch/x86/hvm/svm/intr.c
xen/arch/x86/hvm/vmx/io.c

index 1e283d8bbefb494274f2bea413d31544c6bda408..0f30bd5478c176dc04e337d8e5daae373c6eabdc 100644 (file)
@@ -121,9 +121,12 @@ asmlinkage void svm_intr_assist(void)
           pic_set_irq(pic, pt->irq, 1);
       }
 
-      callback_irq = v->domain->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
-      if ( callback_irq != 0)
-          pic_set_xen_irq(pic, callback_irq, local_events_need_delivery());
+      if (v->vcpu_id == 0) {
+          callback_irq =
+              v->domain->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
+          if ( callback_irq != 0)
+              pic_set_xen_irq(pic, callback_irq, local_events_need_delivery());
+      }
 
       if ( cpu_has_pending_irq(v) )
           intr_vector = cpu_get_interrupt(v, &intr_type);
index ae8d89a31d3bd77a8d21f4aafdfad4f00702fb9b..cc7fdcb1b0b84ed46a2a19f8846f889efab53fea 100644 (file)
@@ -78,7 +78,6 @@ asmlinkage void vmx_intr_assist(void)
     struct hvm_domain *plat=&v->domain->arch.hvm_domain;
     struct periodic_time *pt = &plat->pl_time.periodic_tm;
     struct hvm_virpic *pic= &plat->vpic;
-    int callback_irq;
     unsigned int idtv_info_field;
     unsigned long inst_len;
     int    has_ext_irq;
@@ -91,9 +90,13 @@ asmlinkage void vmx_intr_assist(void)
         pic_set_irq(pic, pt->irq, 1);
     }
 
-    callback_irq = v->domain->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
-    if ( callback_irq != 0 )
-        pic_set_xen_irq(pic, callback_irq, local_events_need_delivery());
+    if (v->vcpu_id == 0) {
+        int callback_irq;
+        callback_irq =
+            v->domain->arch.hvm_domain.params[HVM_PARAM_CALLBACK_IRQ];
+        if ( callback_irq != 0 )
+            pic_set_xen_irq(pic, callback_irq, local_events_need_delivery());
+    }
 
     has_ext_irq = cpu_has_pending_irq(v);